package org.tri.gui.worker;

import java.util.concurrent.ExecutionException;
import org.tri.entity.Establecimiento;
import org.tri.persistence.PersistenceManager;

/**
 * La clase {@code EstablecimientoTransientWorker} es una worker/transienter
 * específico para la clase {@code Establecimiento} para optimizar la 
 * eliminación de entidades de esta clase, ya que el método utilizado por
 * Hibernate es muy engorroso y lento.
 * @author kiira
 * @version 1.0, Feb 16, 2012
 */
public class EstablecimientoTransientWorker extends TransientWorker {

    /**
     * Construye el worker señalando el establecimiento a eliminar.
     * @param establecimiento establecimiento a eliminar.
     */
    public EstablecimientoTransientWorker(
            Establecimiento establecimiento ) {
        super( establecimiento );

    }//end constructor

    /**
     * {@inheritDoc}
     */
    @Override
    protected Object doInBackground() throws Exception {
        Establecimiento establecimiento = (Establecimiento)objectToTransient;
        
        //primero, eliminamos el establecimiento de su productor
        establecimiento.getProductor().getEstablecimientos().
                remove( establecimiento );

        //tenemos que eliminar algunas partes del arbol manualmente
        //para evitar errores y lentitud
        String query = String.format(
                "DELETE FROM ANIMAL WHERE compra IN"
                + " (SELECT id_compra FROM compra WHERE"
                + " establecimiento = %s)",
                establecimiento.getIdEstablecimiento() );

        PersistenceManager.executeQuery( query );

        query = String.format(
                "DELETE FROM VENTA WHERE establecimiento = %s",
                establecimiento.getIdEstablecimiento() );

        PersistenceManager.executeQuery( query );

        query = String.format(
                "DELETE FROM COMPRA WHERE establecimiento = %s",
                establecimiento.getIdEstablecimiento() );

        PersistenceManager.executeQuery( query );
               
        //eliminamos el establecimiento
        query = String.format(
                "DELETE FROM establecimiento WHERE id_establecimiento = %s",
                establecimiento.getIdEstablecimiento() );

        PersistenceManager.executeQuery( query );

        return null;

    }//end método doInBackground

    /**
     * Comprueba que se completo con la tarea con éxtito y se envian eventos
     * según corresponda.
     */
    @Override
    protected void done() {
        try {
            //comprobamos que termino con exito
            get();

        } catch ( InterruptedException ex ) {
        } catch ( ExecutionException ex ) {
            fireErrorTransit( ex );

        } finally {
            fireDoneTrasit();

        }

    }//end método done

}//end clase EstablecimientoTransientWorker
